포스트

15. 빈 생명주기 콜백

15. 빈 생명주기 콜백

빈 생명주기 콜백

  • 데이터베이스 커넥션 풀이나 네트워크 소켓 연결 같은 경우 작업 전에 미리 연결을 해놓고 한번에 해제 시켜야한다.
    • 즉 객체의 초기화와 종료 작업이 필요하다.
  • 스프링 빈은 다음과 같은 생성 주기를 가진다.

    객체 주입 → 의존관계 주입

  • 스프링 빈은 객체를 생성하고 의존 관계 주입이 끝나고 나서야 데이터를 사용할 준비가 된다.
  • 즉 초기화 작업이 모두 끝나고 호출해야한다.
    • 그렇다면 언제 모든 주입이 완료된 시점을 알 수 있을까?
  • 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공한다. → 초기화 콜백
  • 마찬가지로 종료되기 직전에 소멱 콜백을 준다. → 소멸 콜백

스프링 빈의 라이프 사이클

스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료


참고 : 객체의 생성과 초기화를 분리

  • 단일 책임원칙에 따라야한다.
  • 생성과 초기화는 다른다.
    • 초기화 : 외부 커넥션 연결 같은 무거운 동작을 생성자에서 하는건 단일 원칙에 어긋난다.
    • 즉 생성자에서 하는것보단 객체 생성 부분과 초기화 부분을 나누는 것이 좋다.

스프링은 3가지 방법으로 콜백 지원

인터페이스 기반 ( InitailizingBean, DisposableBean )

  • 인터페이스의 메서드를 @override 하면 초기화와 소멸 직전을 알 수 가 있다.
  • 초기화 할때 연결 등 초기화 작업수행

단점

  • 스프링에 의존적이다.
  • 코드 레벨 즉 인터페이스까지 이거 할려고 가져오는건 부담이 된다.
  • 외부 라이브러리에는 적용 불가

이러한 방법은 스프링 초창기에 나온 방법이다.

빈 등록 초기화 소멸 메서드

  • 설정 정보에 초기화와 소멸 메서드를 지정하는 방법
1
@Bean(initMethod = "초기화 메서드" destroyMehtod = "소멸 메서드")
  • 메서드 이름을 이제 자유롭게 쓸 수 있다.
  • 스프링에 의존하지 않는다.
  • 코드가 아니라 설정 정보 사용, 즉 외부 라이브러리에도 사용 가능
  • 종료 메서드를 추론가능하다
    • close , destroy , shutdown같은 종료 메서드에 대해 이름으로 추론해서 사용한다.
    • 즉 내가 직접 명시하지 않아도 뭔가 종료 메서드 같아 보이는 이름을 소멸 메서드로 사용한다.

어노테이션 활용 방법

  • 스프링 권장 방법

**@PostConstruct , @PreDestroy**

  • 초기화 할 메서드에 어노테이션 사용
  • 스프링에 독립적이기에 다른 컨테이너에서도 자주 사용된다.
  • 컴포넌트 스캔과도 잘 어울린다.
  • 단점 : 외부 라이브러리에 적용이 불가능하다
    • 코드를 고칠수가 없는걸…

정리

  • 어노테이션 방식을 사용한다.
  • 외부 라이브러리가 초기화나 소멸 작업에 필요하다면 빈 등록 정보에 설정해놓자.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.